/**
 * $version:  0.1 
 * $Date: 2011-01-21 
 *
 * Copyright (C) 2010-2011 Jawa Software. All rights reserved.
 *
 */
package org.jawa.util;

import java.io.Serializable;

/**
 * 分页时使用的对象.
 * 
 * @author Y.N
 */
public class Page implements Serializable {

	private static final long serialVersionUID = -2377824820825454483L;

	// 当前页面索引
	private int pageIndex = 0;

	// 每页可以显示的数据条数
	private int pageSize = 0;

	// 数据总条数
	private int totalCount = 0;

	// 页面总数
	private int pageCount = 0;

	/**
	 * 实例化一个页面对象，指定当前页面索引以及每页可以显示的数据条数。
	 * 
	 * @param pageIndex
	 *            当前页面索引
	 * @param pageSize
	 *            每页可以显示的数据条数
	 */
	public Page(int pageIndex, int pageSize) {
		if (pageIndex < 1 || pageSize < 1 || pageSize > 10000)
			throw new IllegalArgumentException();
		this.pageIndex = pageIndex;
		this.pageSize = pageSize;
	}

	/**
	 * 默认实例化一个页面对象。
	 */
	public Page() {
		
	}

	/**
	 * 实例化一个页面对象，指定当前页面索引以及默认的每页可以显示的数据条数为(30)。
	 * 
	 * @param pageIndex
	 *            当前页面索引
	 */
	public Page(int pageIndex) {
		this(pageIndex, 30);
	}

	/**
	 * 返回当前页面索引.
	 */
	public int getPageIndex() {
		return pageIndex;
	}

	/**
	 * 返回每页可以显示的数据条数.
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 返回总的分页页数。
	 */
	public int getPageCount() {
		return pageCount;
	}

	/**
	 * 返回总的数据条数。
	 */
	public int getTotalCount() {
		return totalCount;
	}

	/**
	 * 返回当前页面的第一条记录索引。
	 */
	public int getFirstResult() {
		return (pageIndex - 1) * pageSize;
	}

	/**
	 * 返回当前页面的最后一条记录索引。
	 */
	public int getLastResult() {
		if (totalCount == 0)
			return 0;
		int last = (pageIndex) * pageSize - 1;
		return last >= totalCount ? totalCount - 1 : last;
	}

	/**
	 * 是否存在上一页。
	 */
	public boolean getHasPrevious() {
		return pageIndex > 1;
	}

	/**
	 *是否存在下一页。
	 */
	public boolean getHasNext() {
		return pageIndex < pageCount;
	}

	/**
	 * 设置每页可以显示的数据条数.
	 * 
	 * @param pageSize
	 */
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	/**
	 * 设置总的数据条数。
	 */
	public void setTotalCount(int totalCount) {
		this.totalCount = (totalCount);
		if(this.pageSize==0){
			return;
		}
		pageCount = this.totalCount / this.pageSize + (this.totalCount % this.pageSize == 0 ? 0 : 1);
		// 调整页面索引
		if (this.totalCount == 0) {
			if (pageIndex != 1)
				throw new IndexOutOfBoundsException("Page index out of range.");
		} else {
			if (pageIndex > pageCount)
				throw new IndexOutOfBoundsException("Page index out of range.");
		}
	}

	/**
	 * 设置当前页面索引.
	 * 
	 * @param pageIndex
	 */
	public void setPageIndex(int pageIndex) {
		this.pageIndex = pageIndex;
	}

	/**
	 * 是否存在数据条数。
	 */
	public boolean isEmpty() {
		return totalCount == 0;
	}
}
